package cn.tedu.util;

import java.util.*;

//测试   List接口
public class Test3 {
    public static <list> void main(String[] args) {
        //1.创建对象
        List<Integer> list=new ArrayList<>();
        //2.调用方法
            //继承自父接口Collection的
        // boolean add(E e) 有序+可以重复+可以存多个null
        System.out.println(list.add(100));
        System.out.println(list.add(200));
        System.out.println(list.add(300));
        System.out.println(list.add(100));
        System.out.println(list.add(200));
        System.out.println(list.add(null));
        System.out.println(list.add(null));
        System.out.println(list);
        list.containsAll(Collections.singleton(2));

        //自己扩展的方法
        //void add(int index, E element)
        list.add(0,10);//在指定下标位置添加新元素
        System.out.println(list);
        // E get(int index)
        System.out.println(list.get(3));//获取下标为3的对应的元素
        //int indexOf(Object o)
        System.out.println(list.indexOf(200));//获取200这个元素第一次出现的下标
        // int lastIndexOf(Object o)
        System.out.println(list.lastIndexOf(200));//获取200这个元素最后一次出现的下标
        // E remove(int index)
        System.out.println(list.remove(1));//移除1下标出的元素
        // E set(int index, E element)
        System.out.println(list.set(5,888));//把5下标处的元素换成888
        System.out.println(list);
        // List<E> subList(int fromIndex, int toIndex)
        List<Integer> list2=list.subList(2,6);//从2开始到6结束,截取子list2 --[2,6)
        System.out.println(list2);

        //练习：移除指定的元素
        // E remove(int index)
//        System.out.println(list.remove(2));
        //boolean remove(Object o)
        System.out.println(list.remove(new Integer(300))); //自动装箱(new Integer(300)才能使用，不然默认为300是下标
        System.out.println(list);

        //TODO 迭代list接口中元素的方式
        //方式1：继承自父接口的方法Iterator<E> iterator( )
        Iterator<Integer> it= list.iterator();
        while (it.hasNext()) {//判断有没有元素
            Integer date =it.next();//获取元素
            System.out.println(date);
        }
        System.out.println("****************");
        //方式2：list有下标，根据下标遍历for循环
        for (int i = 0; i <list.size() ; i++) {
            Integer date =list.get(i);
            System.out.println(date);
        }

        System.out.println("****************");
        //方式3：foreach遍历
        for (Integer X:list) {
            System.out.println(X);
        }
        System.out.println("****************");
        //方式4：list子接口的扩展方法listIterator<E> iterator( )
        ListIterator<Integer>  it2=list.listIterator();
        //顺序遍历
        while (it2.hasNext()) {//判断有没有元素
            Integer date =it2.next();//获取元素
            System.out.println(date);
        }
        //逆向遍历
        while (it2.hasPrevious()) {//判断前面有没有元素
            Integer date =it2.previous();//获取前面的元素
            System.out.println("date="+date);
        }
        //TODO  面试题1:数组和集合的区别
        //TODO  面试题2:List接口的迭代方式
        //TODO  面试题3:iterator()和listIterator()的区别
        //前者是父类接口iterator( )提供的，后者是listIterator()子接口提供的。
        //listIterator子接口可以使用父接口的所有功能也能进行扩展。
        //扩展了逆向遍历（必须先顺序遍历）才能使用逆向遍历。
    }
}
